package cn.edu.tju.core.security;

import cn.edu.tju.core.model.User;
import cn.edu.tju.core.security.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * 权限管理工具类
 * 实现基于角色的数据访问控制
 */
@Component
public class PermissionUtils {

    @Autowired
    private UserService userService;

    /**
     * 检查当前用户是否为管理员
     */
    public boolean isAdmin() {
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        return currentUser.get().getAuthorities().stream()
                .anyMatch(authority -> "ADMIN".equals(authority.getName()));
    }

    /**
     * 检查当前用户是否为商家
     */
    public boolean isBusiness() {
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        return currentUser.get().getAuthorities().stream()
                .anyMatch(authority -> "BUSINESS".equals(authority.getName()));
    }

    /**
     * 检查当前用户是否为普通用户
     */
    public boolean isUser() {
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        return currentUser.get().getAuthorities().stream()
                .anyMatch(authority -> "USER".equals(authority.getName()));
    }

    /**
     * 检查当前用户是否有权限访问指定用户的数据
     * 管理员可以访问所有数据，普通用户只能访问自己的数据
     */
    public boolean canAccessUserData(Long targetUserId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(targetUserId);
    }

    /**
     * 检查当前用户是否有权限访问指定店铺的数据
     * 管理员可以访问所有数据，商家只能访问自己的店铺数据
     */
    public boolean canAccessBusinessData(Long businessOwnerId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(businessOwnerId);
    }

    /**
     * 检查当前用户是否有权限访问指定订单的数据
     * 管理员可以访问所有数据，用户只能访问自己的订单数据
     */
    public boolean canAccessOrderData(Long orderCustomerId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(orderCustomerId);
    }

    /**
     * 检查当前用户是否有权限访问指定地址的数据
     * 管理员可以访问所有数据，用户只能访问自己的地址数据
     */
    public boolean canAccessAddressData(Long addressCustomerId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(addressCustomerId);
    }

    /**
     * 检查当前用户是否有权限访问指定购物车的数据
     * 管理员可以访问所有数据，用户只能访问自己的购物车数据
     */
    public boolean canAccessCartData(Long cartCustomerId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(cartCustomerId);
    }

    /**
     * 检查当前用户是否有权限访问指定收藏的数据
     * 管理员可以访问所有数据，用户只能访问自己的收藏数据
     */
    public boolean canAccessStarData(Long starUserId) {
        if (isAdmin()) {
            return true; // 管理员可以访问所有数据
        }
        
        Optional<User> currentUser = userService.getUserWithAuthorities();
        if (currentUser.isEmpty()) {
            return false;
        }
        
        return currentUser.get().getId().equals(starUserId);
    }

    /**
     * 获取当前用户ID
     */
    public Long getCurrentUserId() {
        Optional<User> currentUser = userService.getUserWithAuthorities();
        return currentUser.map(User::getId).orElse(null);
    }
}

